package com.project.game;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;

import javax.swing.JPanel;

public class Obstacle{
	private int targetX, targetY, vX, vY;
	private double distance, aCos, aSin;
	private JPanel scene;
	private Image image;
	private Point position;
	private int speed, level = 6;
	private boolean remove = false;
	
	private int rowCount = 4, columnCount = 4; // 세로, 가로
	private int currentIndex, rowIndex, columnIndex; //현재 표시되는 단위이미지의 순서번호
	private int width, height; //단위 이미지 너비, 높이
	private long prevChangedTime; //마지막으로 단위 이미지 위치를 변경한 시간
	private int changeSpeed; // 단위 이미지를 교체하는 시간 간격

	private Rectangle collisionArea;
	
	public Point getPosition() {
		return position;
	}
	public void setPosition(Point point) {
		this.position = point;
	}
	public boolean isRemove() {
		return remove;
	}
	public void setRemove(boolean remove) {
		this.remove = remove;
	}

	public Obstacle(JPanel scene, Image image, Point position) {
		this.scene = scene;
		this.image = image;
		this.position = position;
		speed = (int)(Math.random()*level)+level;
		
		currentIndex = -1;
		width = image.getWidth(null) / columnCount;
		height = image.getHeight(null) / rowCount;
		
		changeSpeed = 1000;
		
//		collisionArea = new Rectangle();
//		collisionArea.width = (int)(image.getWidth(null) * 0.8);
//		collisionArea.height = (int)(image.getHeight(null) * 0.8);
//		
		targetX = scene.getWidth() / 2;
		targetY = scene.getHeight() / 2;
		vX = position.x - targetX;
		vY = position.y - targetY;
		distance = Math.sqrt(Math.pow(vX, 2) + Math.pow(vY, 2));
		aCos = Math.cos(Math.acos(vX/distance));
		aSin = Math.sin(Math.asin(vY/distance));

	}
	
	public Rectangle getCollisionArea() {
		collisionArea.x = position.x + (image.getWidth(null) - collisionArea.width) / 2;
		collisionArea.y = position.y + (image.getHeight(null) - collisionArea.height) / 2;
		return collisionArea;
	}
	
	public void update() {
		long currentTime = System.currentTimeMillis();
		if (prevChangedTime + changeSpeed < currentTime) {
			currentIndex++;
			rowIndex = currentIndex / rowCount;
			columnIndex = currentIndex % columnCount;
			if (currentIndex == rowCount * columnCount) {
				remove = true; 
			}
			prevChangedTime = currentTime;
		}
		
		position.x -= aCos * speed;
		position.y -= aSin * speed;
	}
	
	public void render(Graphics g) {
		if(!remove){
			g.drawImage(
				image, 
				position.x, 					//이미지가 그려질 화면 영역 좌상단 x좌표
				position.y, 					//이미지가 그려질 화면 영역 좌상단 y좌표
				position.x + width, 			//이미지가 그려질 화면 영역 우하단 x좌표
				position.y + height,			//이미지가 그려질 화면 영역 우하단 y좌표
				columnIndex * width, 			//전체이미지에서 추출할 이미지 영역 좌상단 x좌표
				rowIndex * height, 				//전체이미지에서 추출할 이미지 영역 좌상단 y좌표
				columnIndex * width + width, 	//전체이미지에서 추출할 이미지 영역 우하단 x좌표
				rowIndex * height + height,	 	//전체이미지에서 추출할 이미지 영역 우하단 y좌표
				null);
		}
	}
	
}
